/**
 * @file ice_calculation.h
 * @brief 覆冰计算模块接口
 * @version 1.0
 * @date 2023-03-15
 */

#ifndef ICE_CALCULATION_H
#define ICE_CALCULATION_H

#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
#include "common_defs.h"  // 包含通用定义，已包含IceType和RiskLevel定义

// 添加全局变量声明以便在ice_calculation.c中访问
extern RunMode g_run_mode;

// 添加覆冰状态枚举定义
typedef enum {
    ICE_STATUS_NONE = 0,         // 无覆冰
    ICE_STATUS_INCREASING,       // 覆冰厚度增加
    ICE_STATUS_DECREASING,       // 覆冰厚度减少
    ICE_STATUS_UNCHANGED         // 覆冰厚度保持不变
} IceStatus;

// 全局变量声明 - 存储当前覆冰厚度用于判断冰类型
extern float g_current_ice_thickness;

#ifdef __cplusplus
extern "C" {
#endif

// 导线参数
typedef struct {
    float diameter;        // 导线直径 (mm)
    float weight_per_m;    // 每米重量 (kg/m)
    float tension_no_ice;  // 无冰情况下的张力 (N)
    float span;            // 档距 (m)
} CableParameters;

// 常量定义
#define ICE_DENSITY_MIN  300.0f  // 最小覆冰密度(kg/m³) - 霜
#define ICE_DENSITY_MAX  917.0f  // 最大覆冰密度(kg/m³) - 雨凇
#define GRAVITY_ACCEL    9.81f   // 重力加速度(m/s²)
#define ICE_DENSITY_AVG  600.0f  // 平均冰密度(kg/m³)

// 函数声明
float calculate_ice_density(float temperature, float humidity);
float calculate_ice_weight(float thickness, float cable_diameter, float density, float length);
float calculate_ice_volume(float thickness, float cable_diameter, float length);
float calculate_tension_increase(const CableParameters *cable, float ice_weight);
float calculate_ice_thickness(float measured_diameter, float cable_diameter);
RiskLevel calculate_ice_risk_level(float thickness, float tension, const CableParameters *cable);

/**
 * @brief 通过传感器数据计算覆冰厚度
 * 
 * @param tension 当前拉力(N)
 * @param temperature 温度(°C)
 * @param humidity 湿度(%)
 * @param wind_speed 风速(m/s)
 * @param wind_direction 风向(°)
 * @param cable 导线参数
 * @return float 计算的覆冰厚度(mm)
 */
float calculate_ice_thickness_from_sensors(float tension, float temperature, float humidity, 
                                         float wind_speed, float wind_direction,
                                         const CableParameters *cable);

/**
 * @brief 根据传感器数据和视觉数据计算最终的覆冰厚度
 * 
 * @param sensor_thickness 传感器计算的厚度(mm)
 * @param visual_thickness 视觉测量的厚度(mm)，若无视觉数据则传入0
 * @param has_visual_data 是否有视觉数据
 * @return float 最终的覆冰厚度(mm)
 */
float calculate_final_ice_thickness(float sensor_thickness, float visual_thickness, bool has_visual_data);

// 新增函数声明
float calculate_ice_weight_from_tension(const CableParameters *cable, float tension_increase);
float calculate_ice_thickness_from_weight(float ice_weight, float ice_density, 
                                        float cable_diameter, float length);

/**
 * @brief 根据当前和历史覆冰厚度判断覆冰状态
 * 
 * @param current_thickness 当前覆冰厚度(mm)
 * @param previous_thickness 历史覆冰厚度(mm)
 * @return IceStatus 覆冰状态
 */
IceStatus determine_ice_status(float current_thickness, float previous_thickness);

/**
 * @brief 获取覆冰状态的描述字符串
 * 
 * @param status 覆冰状态
 * @return const char* 状态描述字符串
 */
const char* get_ice_status_description(IceStatus status);

// 计算校验和的函数
/**
 * @brief 计算校验和
 * 
 * @param data 数据指针
 * @param length 数据长度
 * @return uint8_t 校验和
 */
uint8_t ice_calculate_checksum(const void* data, size_t length);

#ifdef __cplusplus
}
#endif

#endif /* ICE_CALCULATION_H */